home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / calendar.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  22KB  |  630 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. from __future__ import with_statement
  5. import sys
  6. import datetime
  7. import locale as _locale
  8. __all__ = [
  9.     'IllegalMonthError',
  10.     'IllegalWeekdayError',
  11.     'setfirstweekday',
  12.     'firstweekday',
  13.     'isleap',
  14.     'leapdays',
  15.     'weekday',
  16.     'monthrange',
  17.     'monthcalendar',
  18.     'prmonth',
  19.     'month',
  20.     'prcal',
  21.     'calendar',
  22.     'timegm',
  23.     'month_name',
  24.     'month_abbr',
  25.     'day_name',
  26.     'day_abbr']
  27. error = ValueError
  28.  
  29. class IllegalMonthError(ValueError):
  30.     
  31.     def __init__(self, month):
  32.         self.month = month
  33.  
  34.     
  35.     def __str__(self):
  36.         return 'bad month number %r; must be 1-12' % self.month
  37.  
  38.  
  39.  
  40. class IllegalWeekdayError(ValueError):
  41.     
  42.     def __init__(self, weekday):
  43.         self.weekday = weekday
  44.  
  45.     
  46.     def __str__(self):
  47.         return 'bad weekday number %r; must be 0 (Monday) to 6 (Sunday)' % self.weekday
  48.  
  49.  
  50. January = 1
  51. February = 2
  52. mdays = [
  53.     0,
  54.     31,
  55.     28,
  56.     31,
  57.     30,
  58.     31,
  59.     30,
  60.     31,
  61.     31,
  62.     30,
  63.     31,
  64.     30,
  65.     31]
  66.  
  67. class _localized_month:
  68.     _months = [ datetime.date(2001, i + 1, 1).strftime for i in xrange(12) ]
  69.     _months.insert(0, (lambda x: ''))
  70.     
  71.     def __init__(self, format):
  72.         self.format = format
  73.  
  74.     
  75.     def __getitem__(self, i):
  76.         funcs = self._months[i]
  77.  
  78.     
  79.     def __len__(self):
  80.         return 13
  81.  
  82.  
  83.  
  84. class _localized_day:
  85.     _days = [ datetime.date(2001, 1, i + 1).strftime for i in xrange(7) ]
  86.     
  87.     def __init__(self, format):
  88.         self.format = format
  89.  
  90.     
  91.     def __getitem__(self, i):
  92.         funcs = self._days[i]
  93.  
  94.     
  95.     def __len__(self):
  96.         return 7
  97.  
  98.  
  99. day_name = _localized_day('%A')
  100. day_abbr = _localized_day('%a')
  101. month_name = _localized_month('%B')
  102. month_abbr = _localized_month('%b')
  103. (MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY) = range(7)
  104.  
  105. def isleap(year):
  106.     if not year % 4 == 0 and year % 100 != 0:
  107.         pass
  108.     return year % 400 == 0
  109.  
  110.  
  111. def leapdays(y1, y2):
  112.     y1 -= 1
  113.     y2 -= 1
  114.     return (y2 // 4 - y1 // 4 - y2 // 100 - y1 // 100) + (y2 // 400 - y1 // 400)
  115.  
  116.  
  117. def weekday(year, month, day):
  118.     return datetime.date(year, month, day).weekday()
  119.  
  120.  
  121. def monthrange(year, month):
  122.     if month <= month:
  123.         pass
  124.     elif not month <= 12:
  125.         raise IllegalMonthError(month)
  126.     
  127.     day1 = weekday(year, month, 1)
  128.     if month == February:
  129.         pass
  130.     ndays = mdays[month] + isleap(year)
  131.     return (day1, ndays)
  132.  
  133.  
  134. class Calendar(object):
  135.     
  136.     def __init__(self, firstweekday = 0):
  137.         self.firstweekday = firstweekday
  138.  
  139.     
  140.     def getfirstweekday(self):
  141.         return self._firstweekday % 7
  142.  
  143.     
  144.     def setfirstweekday(self, firstweekday):
  145.         self._firstweekday = firstweekday
  146.  
  147.     firstweekday = property(getfirstweekday, setfirstweekday)
  148.     
  149.     def iterweekdays(self):
  150.         for i in xrange(self.firstweekday, self.firstweekday + 7):
  151.             yield i % 7
  152.         
  153.  
  154.     
  155.     def itermonthdates(self, year, month):
  156.         date = datetime.date(year, month, 1)
  157.         days = (date.weekday() - self.firstweekday) % 7
  158.         date -= datetime.timedelta(days = days)
  159.         oneday = datetime.timedelta(days = 1)
  160.         while True:
  161.             yield date
  162.             date += oneday
  163.             if date.month != month and date.weekday() == self.firstweekday:
  164.                 break
  165.                 continue
  166.  
  167.     
  168.     def itermonthdays2(self, year, month):
  169.         for date in self.itermonthdates(year, month):
  170.             if date.month != month:
  171.                 yield (0, date.weekday())
  172.                 continue
  173.             yield (date.day, date.weekday())
  174.         
  175.  
  176.     
  177.     def itermonthdays(self, year, month):
  178.         for date in self.itermonthdates(year, month):
  179.             if date.month != month:
  180.                 yield 0
  181.                 continue
  182.             yield date.day
  183.         
  184.  
  185.     
  186.     def monthdatescalendar(self, year, month):
  187.         dates = list(self.itermonthdates(year, month))
  188.         return [ dates[i:i + 7] for i in xrange(0, len(dates), 7) ]
  189.  
  190.     
  191.     def monthdays2calendar(self, year, month):
  192.         days = list(self.itermonthdays2(year, month))
  193.         return [ days[i:i + 7] for i in xrange(0, len(days), 7) ]
  194.  
  195.     
  196.     def monthdayscalendar(self, year, month):
  197.         days = list(self.itermonthdays(year, month))
  198.         return [ days[i:i + 7] for i in xrange(0, len(days), 7) ]
  199.  
  200.     
  201.     def yeardatescalendar(self, year, width = 3):
  202.         months = [ self.monthdatescalendar(year, i) for i in xrange(January, January + 12) ]
  203.         return [ months[i:i + width] for i in xrange(0, len(months), width) ]
  204.  
  205.     
  206.     def yeardays2calendar(self, year, width = 3):
  207.         months = [ self.monthdays2calendar(year, i) for i in xrange(January, January + 12) ]
  208.         return [ months[i:i + width] for i in xrange(0, len(months), width) ]
  209.  
  210.     
  211.     def yeardayscalendar(self, year, width = 3):
  212.         months = [ self.monthdayscalendar(year, i) for i in xrange(January, January + 12) ]
  213.         return [ months[i:i + width] for i in xrange(0, len(months), width) ]
  214.  
  215.  
  216.  
  217. class TextCalendar(Calendar):
  218.     
  219.     def prweek(self, theweek, width):
  220.         print self.formatweek(theweek, width),
  221.  
  222.     
  223.     def formatday(self, day, weekday, width):
  224.         if day == 0:
  225.             s = ''
  226.         else:
  227.             s = '%2i' % day
  228.         return s.center(width)
  229.  
  230.     
  231.     def formatweek(self, theweek, width):
  232.         return (None, ' '.join)((lambda .0: for d, wd in .0:
  233. self.formatday(d, wd, width))(theweek))
  234.  
  235.     
  236.     def formatweekday(self, day, width):
  237.         if width >= 9:
  238.             names = day_name
  239.         else:
  240.             names = day_abbr
  241.         return names[day][:width].center(width)
  242.  
  243.     
  244.     def formatweekheader(self, width):
  245.         return (None, ' '.join)((lambda .0: for i in .0:
  246. self.formatweekday(i, width))(self.iterweekdays()))
  247.  
  248.     
  249.     def formatmonthname(self, theyear, themonth, width, withyear = True):
  250.         s = month_name[themonth]
  251.         if withyear:
  252.             s = '%s %r' % (s, theyear)
  253.         
  254.         return s.center(width)
  255.  
  256.     
  257.     def prmonth(self, theyear, themonth, w = 0, l = 0):
  258.         print self.formatmonth(theyear, themonth, w, l),
  259.  
  260.     
  261.     def formatmonth(self, theyear, themonth, w = 0, l = 0):
  262.         w = max(2, w)
  263.         l = max(1, l)
  264.         s = self.formatmonthname(theyear, themonth, 7 * (w + 1) - 1)
  265.         s = s.rstrip()
  266.         s += '\n' * l
  267.         s += self.formatweekheader(w).rstrip()
  268.         s += '\n' * l
  269.         for week in self.monthdays2calendar(theyear, themonth):
  270.             s += self.formatweek(week, w).rstrip()
  271.             s += '\n' * l
  272.         
  273.         return s
  274.  
  275.     
  276.     def formatyear(self, theyear, w = 2, l = 1, c = 6, m = 3):
  277.         w = max(2, w)
  278.         l = max(1, l)
  279.         c = max(2, c)
  280.         colwidth = (w + 1) * 7 - 1
  281.         v = []
  282.         a = v.append
  283.         a(repr(theyear).center(colwidth * m + c * (m - 1)).rstrip())
  284.         a('\n' * l)
  285.         header = self.formatweekheader(w)
  286.         for i, row in enumerate(self.yeardays2calendar(theyear, m)):
  287.             months = xrange(m * i + 1, min(m * (i + 1) + 1, 13))
  288.             a('\n' * l)
  289.             names = (lambda .0: for k in .0:
  290. self.formatmonthname(theyear, k, colwidth, False))(months)
  291.             a(formatstring(names, colwidth, c).rstrip())
  292.             a('\n' * l)
  293.             headers = (lambda .0: for k in .0:
  294. header)(months)
  295.             a(formatstring(headers, colwidth, c).rstrip())
  296.             a('\n' * l)
  297.             height = max((lambda .0: for cal in .0:
  298. len(cal))(row))
  299.             for j in xrange(height):
  300.                 weeks = []
  301.                 for cal in row:
  302.                     if j >= len(cal):
  303.                         weeks.append('')
  304.                         continue
  305.                     ((None, None, None),)
  306.                     weeks.append(self.formatweek(cal[j], w))
  307.                 
  308.                 a(formatstring(weeks, colwidth, c).rstrip())
  309.                 a('\n' * l)
  310.             
  311.         
  312.         return ''.join(v)
  313.  
  314.     
  315.     def pryear(self, theyear, w = 0, l = 0, c = 6, m = 3):
  316.         print self.formatyear(theyear, w, l, c, m)
  317.  
  318.  
  319.  
  320. class HTMLCalendar(Calendar):
  321.     cssclasses = [
  322.         'mon',
  323.         'tue',
  324.         'wed',
  325.         'thu',
  326.         'fri',
  327.         'sat',
  328.         'sun']
  329.     
  330.     def formatday(self, day, weekday):
  331.         if day == 0:
  332.             return '<td class="noday"> </td>'
  333.         else:
  334.             return '<td class="%s">%d</td>' % (self.cssclasses[weekday], day)
  335.  
  336.     
  337.     def formatweek(self, theweek):
  338.         s = (''.join,)((lambda .0: for d, wd in .0:
  339. self.formatday(d, wd))(theweek))
  340.         return '<tr>%s</tr>' % s
  341.  
  342.     
  343.     def formatweekday(self, day):
  344.         return '<th class="%s">%s</th>' % (self.cssclasses[day], day_abbr[day])
  345.  
  346.     
  347.     def formatweekheader(self):
  348.         s = (''.join,)((lambda .0: for i in .0:
  349. self.formatweekday(i))(self.iterweekdays()))
  350.         return '<tr>%s</tr>' % s
  351.  
  352.     
  353.     def formatmonthname(self, theyear, themonth, withyear = True):
  354.         if withyear:
  355.             s = '%s %s' % (month_name[themonth], theyear)
  356.         else:
  357.             s = '%s' % month_name[themonth]
  358.         return '<tr><th colspan="7" class="month">%s</th></tr>' % s
  359.  
  360.     
  361.     def formatmonth(self, theyear, themonth, withyear = True):
  362.         v = []
  363.         a = v.append
  364.         a('<table border="0" cellpadding="0" cellspacing="0" class="month">')
  365.         a('\n')
  366.         a(self.formatmonthname(theyear, themonth, withyear = withyear))
  367.         a('\n')
  368.         a(self.formatweekheader())
  369.         a('\n')
  370.         for week in self.monthdays2calendar(theyear, themonth):
  371.             a(self.formatweek(week))
  372.             a('\n')
  373.         
  374.         a('</table>')
  375.         a('\n')
  376.         return ''.join(v)
  377.  
  378.     
  379.     def formatyear(self, theyear, width = 3):
  380.         v = []
  381.         a = v.append
  382.         width = max(width, 1)
  383.         a('<table border="0" cellpadding="0" cellspacing="0" class="year">')
  384.         a('\n')
  385.         a('<tr><th colspan="%d" class="year">%s</th></tr>' % (width, theyear))
  386.         for i in xrange(January, January + 12, width):
  387.             months = xrange(i, min(i + width, 13))
  388.             a('<tr>')
  389.             for m in months:
  390.                 a('<td>')
  391.                 a(self.formatmonth(theyear, m, withyear = False))
  392.                 a('</td>')
  393.             
  394.             a('</tr>')
  395.         
  396.         a('</table>')
  397.         return ''.join(v)
  398.  
  399.     
  400.     def formatyearpage(self, theyear, width = 3, css = 'calendar.css', encoding = None):
  401.         if encoding is None:
  402.             encoding = sys.getdefaultencoding()
  403.         
  404.         v = []
  405.         a = v.append
  406.         a('<?xml version="1.0" encoding="%s"?>\n' % encoding)
  407.         a('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n')
  408.         a('<html>\n')
  409.         a('<head>\n')
  410.         a('<meta http-equiv="Content-Type" content="text/html; charset=%s" />\n' % encoding)
  411.         if css is not None:
  412.             a('<link rel="stylesheet" type="text/css" href="%s" />\n' % css)
  413.         
  414.         a('<title>Calendar for %d</title\n' % theyear)
  415.         a('</head>\n')
  416.         a('<body>\n')
  417.         a(self.formatyear(theyear, width))
  418.         a('</body>\n')
  419.         a('</html>\n')
  420.         return ''.join(v).encode(encoding, 'xmlcharrefreplace')
  421.  
  422.  
  423.  
  424. class TimeEncoding:
  425.     
  426.     def __init__(self, locale):
  427.         self.locale = locale
  428.  
  429.     
  430.     def __enter__(self):
  431.         self.oldlocale = _locale.setlocale(_locale.LC_TIME, self.locale)
  432.         return _locale.getlocale(_locale.LC_TIME)[1]
  433.  
  434.     
  435.     def __exit__(self, *args):
  436.         _locale.setlocale(_locale.LC_TIME, self.oldlocale)
  437.  
  438.  
  439.  
  440. class LocaleTextCalendar(TextCalendar):
  441.     
  442.     def __init__(self, firstweekday = 0, locale = None):
  443.         TextCalendar.__init__(self, firstweekday)
  444.         if locale is None:
  445.             locale = _locale.getdefaultlocale()
  446.         
  447.         self.locale = locale
  448.  
  449.     
  450.     def formatweekday(self, day, width):
  451.         
  452.         try:
  453.             encoding = _[2]
  454.             if width >= 9:
  455.                 names = day_name
  456.             else:
  457.                 names = day_abbr
  458.             name = names[day]
  459.             if encoding is not None:
  460.                 name = name.decode(encoding)
  461.             
  462.             return name[:width].center(width)
  463.         finally:
  464.             pass
  465.  
  466.  
  467.     
  468.     def formatmonthname(self, theyear, themonth, width, withyear = True):
  469.         
  470.         try:
  471.             encoding = _[2]
  472.             s = month_name[themonth]
  473.             if encoding is not None:
  474.                 s = s.decode(encoding)
  475.             
  476.             if withyear:
  477.                 s = '%s %r' % (s, theyear)
  478.             
  479.             return s.center(width)
  480.         finally:
  481.             pass
  482.  
  483.  
  484.  
  485.  
  486. class LocaleHTMLCalendar(HTMLCalendar):
  487.     
  488.     def __init__(self, firstweekday = 0, locale = None):
  489.         HTMLCalendar.__init__(self, firstweekday)
  490.         if locale is None:
  491.             locale = _locale.getdefaultlocale()
  492.         
  493.         self.locale = locale
  494.  
  495.     
  496.     def formatweekday(self, day):
  497.         
  498.         try:
  499.             encoding = _[2]
  500.             s = day_abbr[day]
  501.             if encoding is not None:
  502.                 s = s.decode(encoding)
  503.             
  504.             return '<th class="%s">%s</th>' % (self.cssclasses[day], s)
  505.         finally:
  506.             pass
  507.  
  508.  
  509.     
  510.     def formatmonthname(self, theyear, themonth, withyear = True):
  511.         
  512.         try:
  513.             encoding = _[2]
  514.             s = month_name[themonth]
  515.             if encoding is not None:
  516.                 s = s.decode(encoding)
  517.             
  518.             if withyear:
  519.                 s = '%s %s' % (s, theyear)
  520.             
  521.             return '<tr><th colspan="7" class="month">%s</th></tr>' % s
  522.         finally:
  523.             pass
  524.  
  525.  
  526.  
  527. c = TextCalendar()
  528. firstweekday = c.getfirstweekday
  529.  
  530. def setfirstweekday(firstweekday):
  531.     if firstweekday <= firstweekday:
  532.         pass
  533.     elif not firstweekday <= SUNDAY:
  534.         raise IllegalWeekdayError(firstweekday)
  535.     
  536.     c.firstweekday = firstweekday
  537.  
  538. monthcalendar = c.monthdayscalendar
  539. prweek = c.prweek
  540. week = c.formatweek
  541. weekheader = c.formatweekheader
  542. prmonth = c.prmonth
  543. month = c.formatmonth
  544. calendar = c.formatyear
  545. prcal = c.pryear
  546. _colwidth = 20
  547. _spacing = 6
  548.  
  549. def format(cols, colwidth = _colwidth, spacing = _spacing):
  550.     print formatstring(cols, colwidth, spacing)
  551.  
  552.  
  553. def formatstring(cols, colwidth = _colwidth, spacing = _spacing):
  554.     spacing *= ' '
  555.     return (spacing.join,)((lambda .0: for c in .0:
  556. c.center(colwidth))(cols))
  557.  
  558. EPOCH = 1970
  559. _EPOCH_ORD = datetime.date(EPOCH, 1, 1).toordinal()
  560.  
  561. def timegm(tuple):
  562.     (year, month, day, hour, minute, second) = tuple[:6]
  563.     days = (datetime.date(year, month, 1).toordinal() - _EPOCH_ORD) + day - 1
  564.     hours = days * 24 + hour
  565.     minutes = hours * 60 + minute
  566.     seconds = minutes * 60 + second
  567.     return seconds
  568.  
  569.  
  570. def main(args):
  571.     import optparse as optparse
  572.     parser = optparse.OptionParser(usage = 'usage: %prog [options] [year [month]]')
  573.     parser.add_option('-w', '--width', dest = 'width', type = 'int', default = 2, help = 'width of date column (default 2, text only)')
  574.     parser.add_option('-l', '--lines', dest = 'lines', type = 'int', default = 1, help = 'number of lines for each week (default 1, text only)')
  575.     parser.add_option('-s', '--spacing', dest = 'spacing', type = 'int', default = 6, help = 'spacing between months (default 6, text only)')
  576.     parser.add_option('-m', '--months', dest = 'months', type = 'int', default = 3, help = 'months per row (default 3, text only)')
  577.     parser.add_option('-c', '--css', dest = 'css', default = 'calendar.css', help = 'CSS to use for page (html only)')
  578.     parser.add_option('-L', '--locale', dest = 'locale', default = None, help = 'locale to be used from month and weekday names')
  579.     parser.add_option('-e', '--encoding', dest = 'encoding', default = None, help = 'Encoding to use for output')
  580.     parser.add_option('-t', '--type', dest = 'type', default = 'text', choices = ('text', 'html'), help = 'output type (text or html)')
  581.     (options, args) = parser.parse_args(args)
  582.     if options.locale and not (options.encoding):
  583.         parser.error('if --locale is specified --encoding is required')
  584.         sys.exit(1)
  585.     
  586.     locale = (options.locale, options.encoding)
  587.     if options.type == 'html':
  588.         if options.locale:
  589.             cal = LocaleHTMLCalendar(locale = locale)
  590.         else:
  591.             cal = HTMLCalendar()
  592.         encoding = options.encoding
  593.         if encoding is None:
  594.             encoding = sys.getdefaultencoding()
  595.         
  596.         optdict = dict(encoding = encoding, css = options.css)
  597.         if len(args) == 1:
  598.             print cal.formatyearpage(datetime.date.today().year, **optdict)
  599.         elif len(args) == 2:
  600.             print cal.formatyearpage(int(args[1]), **optdict)
  601.         else:
  602.             parser.error('incorrect number of arguments')
  603.             sys.exit(1)
  604.     elif options.locale:
  605.         cal = LocaleTextCalendar(locale = locale)
  606.     else:
  607.         cal = TextCalendar()
  608.     optdict = dict(w = options.width, l = options.lines)
  609.     if len(args) != 3:
  610.         optdict['c'] = options.spacing
  611.         optdict['m'] = options.months
  612.     
  613.     if len(args) == 1:
  614.         result = cal.formatyear(datetime.date.today().year, **optdict)
  615.     elif len(args) == 2:
  616.         result = cal.formatyear(int(args[1]), **optdict)
  617.     elif len(args) == 3:
  618.         result = cal.formatmonth(int(args[1]), int(args[2]), **optdict)
  619.     else:
  620.         parser.error('incorrect number of arguments')
  621.         sys.exit(1)
  622.     if options.encoding:
  623.         result = result.encode(options.encoding)
  624.     
  625.     print result
  626.  
  627. if __name__ == '__main__':
  628.     main(sys.argv)
  629.  
  630.